Le machine learning permet notamment de prédire des valeurs et prendre des décisions.
Processus de modélisation
Exploratory data analysis (EDA): Comprendre les données, se poser des questions
Feature engineering: Créer de nouvelles variables à partir des données ou sélectionner les variables les plus pertinentes
Sélection de modèle et tuning: Choisir le modèle le plus adapté et ajuster les hyperparamètres
Évaluation du modèle: Mesurer la performance du modèle
Processus de modélisation
Choix du modèle
Supervised learning: On a des données étiquetées
Classification
Régression
Unsupervised learning: On a des données non étiquetées
Clustering
Réduction de dimension
…
Choix du modèle
Modàlisation et tidyverse
Tidymodel est un ensemble de packages qui permettent de faire du machine learning avec le tidyverse.
On retrouve les packages:
parsnip: Interface pour les modèles
dials: Sélection d’hyperparamètres
tune: Tuning des hyperparamètres
workflow: Workflows pour les modèles
yardstick: Métriques de performance
recipes: Préparation des données
Données du jour
nycflights13
Le package nycflights13 contient des données sur les vols au départ de New York en 2013.
set.seed(123)library(nycflights13)flight_data <- flights %>%mutate(# On change le retard en facteurarr_delay =ifelse(arr_delay >=30, "late", "on_time"),arr_delay =factor(arr_delay) ) %>%# On ajoute les données de météoinner_join(weather, by =c("origin", "time_hour")) %>%# On ne garde que les colonnes utilesselect(dep_time, flight, origin, dest, air_time, distance, carrier, arr_delay, time_hour, temp, wind_speed, precip) %>%# On enlève les lignes avec des données manquantesna.omit() %>%# Pour faire des modèles, on préfère avoir des facteurs que du textemutate_if(is.character, as.factor) %>%sample_n(size =1000) # Pour que ça aille vite...
Le feature engineering (ou ingénierie des caractéristiques) est le processus de création, de transformation et de sélection des variables (features) utilisées pour entraîner un modèle de machine learning.
L’idée est de préparer les données de manière à améliorer la performance du modèle.
Une première approche : mutate()
flight_data %>%mutate(# Nous aurons besoin de la datedate = lubridate::as_date(time_hour),dow =wday(date),month =month(date) ) %>%select(-time_hour) %>%sample_n(size =5) %>%select(date, dow, month)
tidymodels et son package recipes permettent de créer des recettes pour préparer les données. Cela permet de transformer certaines variables, de créer de nouvelles variables, etc.
Nous allons chercher à prédire le retard en fonction de différentes variables
Une recette de base prend une formule et des données
flights_rec <-recipe( arr_delay ~ ., data = train_data)
Par défaut, toutes les variables sont des predictors.
summary(flights_rec)
# A tibble: 12 × 4
variable type role source
<chr> <list> <chr> <chr>
1 dep_time <chr [2]> predictor original
2 flight <chr [2]> predictor original
3 origin <chr [3]> predictor original
4 dest <chr [3]> predictor original
5 air_time <chr [2]> predictor original
6 distance <chr [2]> predictor original
7 carrier <chr [3]> predictor original
8 time_hour <chr [1]> predictor original
9 temp <chr [2]> predictor original
10 wind_speed <chr [2]> predictor original
11 precip <chr [2]> predictor original
12 arr_delay <chr [3]> outcome original
Recettes
Nous pouvons maintenant appliquer des transformations sur les colonnes pour créer des variables adaptées à notre modèle.
Il existe de nombreuses recettes dans le package recipes. Elles ont toute la forme step_X() où X sera le nom d’une recette. La liste des recettes est disponible ici
Par exemple, la recette step_date permet de transformer une date en une autre variable (jour de la semaine, mois, années, …)
flights_rec <- flights_rec %>%step_date(time_hour, features =c("dow", "month")) %>%step_rm(time_hour) # On enlève la colonne originale
Résultat
prep(flights_rec) %>%juice() %>%sample_n(size =5) %>%select(starts_with("time_hour")) # Pour voir le résultat
# A tibble: 5 × 2
time_hour_dow time_hour_month
<fct> <fct>
1 Sun Mar
2 Tue Jul
3 Tue Sep
4 Sun Feb
5 Mon Feb
Recettes
Nous allons transformer les variables de différentes manières:
update_role: Pour indiquer les variables que l’on veut garder comme identifiant (ID)
step_multate: Pour créer de nouvelles variables comme un mutate normal
step_date: Pour transformer la date en variables plus utiles
step_holiday: Pour indiquer si une date tombe un jour férié
step_dummy: Pour transformer les variables catégorielles en variables binaires
step_rm: Pour supprimer des colonnes
step_zv: Pour supprimer les variables avec une variance nulle
Recettes
flights_rec <-recipe(arr_delay ~ ., data = train_data) %>%update_role(flight, time_hour, new_role ="ID") %>%step_mutate(date = lubridate::as_date(time_hour)) %>%step_rm(time_hour) %>%step_date(date, features =c("dow", "month")) %>%step_holiday(date, holidays = timeDate::listHolidays("US"), keep_original_cols =FALSE) %>%step_cut(temp,breaks =32) %>%# On crée des catégories de températurestep_dummy(all_nominal_predictors()) %>%step_zv(all_predictors()) # On enlève les variables avec une variance nulle
Workflow
Faire un workflow
Un workflow est une combinaison d’une recette et d’un modèle. Il permet d’enchainer différentes opérations.
Commençons par définir un modèle:
lr_mod <-logistic_reg() %>%set_engine("glm")
workflow
Nous pouvons maintenant combiner notre recette et notre modèle pour créer un workflow.